﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

using Zarion_Quest.ShotTypes;

namespace Zarion_Quest.Base
{
    /// <summary>
    /// Classe abstrata que serve de base para criação de inimigos
    /// </summary>
    abstract class BaseEnemy : AnimatedObject2D
    {
        private int hitPoints;
        /// <summary>
        /// Quantidade de "vida" do inimigo
        /// </summary>
        public int HitPoints
        {
            get { return hitPoints; }
            set { hitPoints = value; }
        }
        private bool isLive;
        /// <summary>
        /// Indica se o inimigo está "vivo", se não estiver ele é removido do jogo pelo EnemyManager
        /// </summary>
        public bool IsLive
        {
            get { return isLive; }
            set { isLive = value; }
        }

        private bool isScreenBound;
        public bool IsScreenBound
        {
            get { return isScreenBound; }
            set { isScreenBound = value; }
        }

        /// <summary>
        /// Construtor...
        /// </summary>
        /// <param name="texture">Imagem (Sprite Sheet)</param>
        /// <param name="columns">Quantidade de colunas do Sprite Sheet</param>
        /// <param name="rows">Quantidade de Linhas do Sprite Sheet</param>
        /// <param name="hitPoints">Quantidade de "vida" do inimigo</param>
        public BaseEnemy(Texture2D texture, int columns, int rows, int hitPoints)
            : base(texture, columns, rows)
        {
            this.hitPoints = hitPoints;
            isLive = true;
            EnemyManager.EnemyList.Add(this);
        }

        /// <summary>
        /// Método para deslocar o inimigo recebendo um Vector2 com a 
        /// </summary>
        /// <param name="quantidade">Quantidade de pixeles em X e Y que deve ser deslocado</param>
        public void move(Vector2 quantidade)
        {
            if (isScreenBound)
                screenBoundMove(quantidade);
            Position = Position + quantidade;
        }

        /// <summary>
        /// Método para deslocar o inimigo pelo eixo X
        /// </summary>
        /// <param name="X">Quantidade de pixles que deve ser deslocado</param>
        public void moveOnX(float X)
        {
            move(new Vector2(X, 0));
        }

        /// <summary>
        /// Método para deslocar o inimigo pelo eixo Y
        /// </summary>
        /// <param name="Y">Quantidade de pixels</param>
        public void moveOnY(float Y)
        {
            move(new Vector2(0, Y));
        }

        private void screenBoundMove(Vector2 quantidade)
        {
            Vector2 finalPosition;

            finalPosition = Position + quantidade;

            if (Position.X + FrameWidth / 2 >= Game1.Self.Window.ClientBounds.Width)
            {
                finalPosition.X = Game1.Self.Window.ClientBounds.Width - FrameWidth / 2;
            }
            else if (Position.X - FrameWidth / 2 <= 0)
            {
                finalPosition.X = 0 + FrameWidth / 2;
            }

            if (Position.Y + FrameHeight / 2 >= Game1.Self.Window.ClientBounds.Height)
            {
                finalPosition.Y = Game1.Self.Window.ClientBounds.Height - FrameHeight / 2;
            }
            else if (Position.Y - FrameHeight / 2 <= 0)
            {
                finalPosition.Y = 0 + FrameHeight / 2;
            }

            Position = finalPosition;
        }

        public virtual void destroy()
        {
            isLive = false;
        }

        public override void collisionNotifier(Object2D caller)
        {
        }
    }
}
